#!/usr/bin/perl
#===============================================================================
# Copyright (c) 2009,
# All rights reserved.
# 摘    要 ：一些常用的时间处理函数
# 作    者 ：2009-12-15 xingwang
# 版    本 ：0.01
#===============================================================================
use strict;
use warnings;
use HTTP::Date;
# ------------------------------
# &subtime(date,n)
# 计算 某天的前 n 天或者后 n 天
# 参数：日期,前n天（n）或后n天（-n）
# ------------------------------
sub subtime {
	my ($date,$number) = @_;
#	use HTTP::Date;
	my $n = str2time($date);
	$n += 86400 * $number;
	my ($s,$mm,$h,$d,$m,$y) = (localtime($n))[0,1,2,3,4,5];
	$y += 1900;
	$m ++;
	if ( $date =~ /:/ ) {
	   return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$mm,$s);
	} else {
	   return sprintf("%4d-%02d-%02d",$y,$m,$d);
	}
}
#print &submonth($ARGV[0],$ARGV[1]),"\n";
# ------------------------------
# &submonth(date,n)
# 计算 某天的前 n 月或者后 n 月
# 参数：日期,前n月（n）或后n月（-n）
# ------------------------------
sub submonth {
      my ($date,$number) = @_;
#      use HTTP::Date;
      my $n_temp = str2time($date);
      my ($m_temp,$y_temp) = (localtime($n_temp))[4,5];
      $y_temp += 1900;
      $m_temp ++;
      my %hs_monthDays = ('1'=>'31','3'=>'31','5'=>'31','7'=>'31','8'=>'31','10'=>'31','12'=>'31','4'=>'30','6'=>'30','9'=>'30','11'=>'30');
      $hs_monthDays{'2'} = ($y_temp%4==0&&$y_temp%100!=0) || $y_temp%400==0 ? 29 : 28;


      my $n = str2time($date);
      my $monthdays = $hs_monthDays{$m_temp};
      $n -= 86400 * $monthdays * $number;
      my ($s,$mm,$h,$d,$m,$y) = (localtime($n))[0,1,2,3,4,5];
      $y += 1900;
      $m ++;
      if ( $date =~ /:/ ) {
         return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$mm,$s);
      } else {
         return sprintf("%4d-%02d-%02d",$y,$m,$d);
      }
}
# ------------------------------
# &nowtime()
# 当前时间
# ------------------------------
sub nowtime {
	my ( $s,$min,$h,$d,$m,$y ) = (localtime(time()))[0,1,2,3,4,5];
        $y += 1900;
        $m ++;
        return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$min,$s);
}

# ------------------------------
# &nowtimess()
# 当前秒
# ------------------------------
sub nowtimess {
	my ( $s,$min,$h,$d,$m,$y ) = (localtime(time()))[0,1,2,3,4,5];
        $y += 1900;
        $m ++;
        return sprintf("%02d",$s);
}

# ------------------------------
# &nowtimemin()
# 当前到分的时间
# ------------------------------
sub nowtimemin {
         my ( $s,$min,$h,$d,$m,$y ) = (localtime(time()))[0,1,2,3,4,5];
#	 my ( $s,$min,$h,$d,$m,$y,$sss ) = (localtime(time()))[0,1,2,3,4,5,6];
         $y += 1900;
         $m ++;
         return sprintf("%4d%02d%02d%02d%02d",$y,$m,$d,$h,$min);
}

# ------------------------------
# &nowdate()
# 当前日期
# ------------------------------
sub nowdate {
            my ( $d,$m,$y ) = (localtime(time()))[3,4,5];
            $y += 1900;
            $m ++;
            return sprintf("%4d-%02d-%02d",$y,$m,$d);
}
# ----------------------------------------------------
# &formatdate()
# 格式化日期
# 输入的格式：
# yyyy-mm-dd、yyyy-m-d、yyyymmdd、yyyy/mm/dd、
# yyyy/m/d、yyyy-mm、yyyy-m、yyyymm、yyyy/mm、yyyy/m
# ----------------------------------------------------
sub formatdate {
	my $date = shift;
        my $type = shift;
        $date =~ /^(\d{4})[-\/](\d{2}|\d)[-\/](\d{2}|\d)$/g; # yyyy-mm-dd yyyy/mm/dd
        $date =~ /^(\d{4})(\d{2})(\d{2})$/;       # yyyymmdd
        $date =~ /^(\d{4})(\d{2})$/;        # yyyymm
        $date =~ /^(\d{4})[-\/](\d{2}|\d)$/g;      # yyyy-mm yyyy/mm
        die "Format Date Erro:The date you input( $date ) is not correct." unless ( $1 or $2 );
        if ( $type eq 'yyyymm' ) {
        	return sprintf("%04d%02d",$1,$2);
        } elsif ( $type eq 'yyyymmdd' and $3) {
                return sprintf("%04d%02d%02d",$1,$2,$3);
        } elsif ( $type eq 'yyyy-mm-dd' and $3) {
                return sprintf("%04d-%02d-%02d",$1,$2,$3);
        } elsif ( $type eq 'yyyy-mm') {
                return sprintf("%04d-%02d",$1,$2);
        } elsif ( $type eq 'alldays' or $type eq 'endday' ) {
                my $hs_monthDays = {'01'=>'31','03'=>'31','05'=>'31','07'=>'31','08'=>'31','10'=>'31','12'=>'31','04'=>'30','06'=>'30','09'=>'30','11'=>'30'};
                $hs_monthDays->{'02'} = ($1%4==0&&$1%100!=0)||$1%400==0 ? 29 : 28;
                return $hs_monthDays->{$2};
        } else {
                die "Format Date Erro:Return date ( Date = $date ,Type = $type ) is not correct."
        }
}




# ------------------------------
# &filedate()
# 当前日期
# ------------------------------
sub filedate {
	my $handle = shift;
    my ( $d,$m,$y ) = (localtime($handle))[3,4,5];
    $y += 1900;
    $m ++;
    return sprintf("%4d-%02d-%02d",$y,$m,$d);
}





1;

#printf &nowtime()."\r\n";

#printf &nowdate()."\r\n";

#printf &formatdate(&nowdate(),'yyyymm')."\r\n";


